package com.jyxd.web.service.hisview;

import com.jyxd.web.error.JyxdException;
import com.jyxd.web.hiscz.service.HisUtilService;
import com.jyxd.web.service.assessment.basic.MedOrderExecService;
import com.jyxd.web.service.hisview.dto.HisViewDataDto;
import com.jyxd.web.service.patient.PatientService;
import com.rabbitmq.client.Channel;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Objects;

import static com.jyxd.web.config.ConstantConfig.*;
@Component
public class HisViewConsume {

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final PatientService patientService;
    private final HisUtilService hisUtilService;
    private final MedOrderExecService medOrderExecService;
    private final HisViewService hisViewService;
    @Value("${icu.job.mq.his.datasource.queue}")
    private String hisDatasourceQueue;

    public HisViewConsume(PatientService patientService, HisUtilService hisUtilService, MedOrderExecService medOrderExecService, HisViewService hisViewService) {
        this.patientService = patientService;
        this.hisUtilService = hisUtilService;
        this.medOrderExecService = medOrderExecService;
        this.hisViewService = hisViewService;
    }


    @Bean(name = "soHisDatasourceQueue")
    public String getHisDatasourceQueue() {
        return hisDatasourceQueue;
    }

    @RabbitListener(queuesToDeclare = @Queue("#{soHisDatasourceQueue}"))
    public void process(Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag, @Payload HisViewDataDto hisViewDataDto) throws IOException {
        try {
            logger.info("his数据中心数据处理  >  >  " + hisViewDataDto);
            if (Objects.isNull(hisViewDataDto))
                return;
            if (StringUtils.isEmpty(hisViewDataDto.getEventKey())) {
                logger.info("数据事件处理 key 不存在，数据处理失败");
                return;
            }
            manageTask(hisViewDataDto);
        } catch (Exception e) {
            logger.info("数据中心对接数据处理出错  》》 异常问题 > > " + e.getMessage());
        }finally {
            channel.basicAck(tag, false);
        }
    }

    /**
     * 根据不同数据key进行
     *
     * @param hisViewDataDto
     */
    private void manageTask(HisViewDataDto hisViewDataDto) {
        switch (hisViewDataDto.getEventKey()) {
            case HIS_VIEW_EVENT_DC_HlLCZJL_BZBWHL:  // 赋值病重（病危）患者护理记录
                // 完成 生命体征数据赋值时调用，（自动同步时也需要）
                hisViewService.saveDcHlczjlBzbwhl(hisViewDataDto.getPatient(), hisViewDataDto.getObject());
                break;
            case HIS_VIEW_EVENT_DC_HLCZJL_BZBWHL_ZDXX:  // 处理 病重（病危）患者护理 记录_诊断
                // 完成 修改诊断时调用，首页修改，his 新增
                hisViewService.saveDcHlczjlBzbwhlZdxx(hisViewDataDto.getPatient());
                break;
            case HIS_VIEW_EVENT_DC_HLCZJL_BZBWHL_GMS:   // 赋值一般护理记录_过敏史
                // 完成 患者新进入时调用，患者新转科时
                hisViewService.saveDcHlczjlBzbwhlGms(hisViewDataDto.getPatient());
                break;
            case HIS_VIEW_EVENT_DC_HLCZJL_BZBWHL_HLCZ:  // 赋值记录_护理操作
                // 完成 基础护理变动时调用 自动同步调用
                hisViewService.saveDcHlczjlBzbwhlHlcz(hisViewDataDto.getPatient(), hisViewDataDto.getPrimaryCare());
                break;
            case HIS_VIEW_EVENT_DC_HLCZJL_BZBWHL_HLGC:   // 赋值记录_护理观察
                // 完成 生命体征变动时调用，自动同步不需要调用
                hisViewService.saveDcHlczjlBzbwhlHlgc(hisViewDataDto.getPatient(), hisViewDataDto.getObject());
                break;
            case HIS_VIEW_EVENT_DC_ICU_DAT_BRXXJLK:   // 处理 赋值ICU 病人信息表
                // 完成 在患者出科，入科，气管插拔管，完成是否为非计划转入患者时调用 （气管，设置非计划）
                hisViewService.handleDcIcuDatBrxxjlk(hisViewDataDto.getPatient());
                break;
            case HIS_VIEW_EVENT_DC_ICU_DAT_TZJL:
            case HIS_VIEW_EVENT_DC_ICU_DAT_TZVALUE:
                // 完成 生命体征数据赋值时调用，（自动同步时也需要）
                hisViewService.saveDcIcuDatTzjlOrDcIcuDatTzvalue(hisViewDataDto.getPatient(), hisViewDataDto.getObject());
                break;
            default:
                throw new JyxdException("Unexpected value: " + hisViewDataDto.getEventKey());
        }
    }
}
